<?php
/**
 * 角色组模型
 * User 1874
 */

namespace app\adminplatform\model;

use think\facade\Cache;
use think\facade\Config;
use think\Model;

class AuthGroup extends Model {
    /*
     * 查询角色组列表
     * @param array $map 查询条件
     */
    public static function getAuthGroupList(array $map=[]){

        return AuthGroup::where($map)->select();
    }
    /*
     * 查角色组信息
     * @param array $map 查询条件
     * @param int $type 查询方法
     */
    public static function getAuthGroupInfo(array $map=[], int $type=0){

        if($type == 0){
            return AuthGroup::where($map)->field('ag_id,ag_name,ag_pid,ag_rules,ag_status')->find();
        }else{
            return AuthGroup::where($map)->count("ag_id");
        }
    }
    /*
     * 获取当前管理员角色所管理的所有角色
     * @param array $list 数据信息
     * @param int $pid 父id
     */
    public static function getChildAuthGroup(array $list, int $pid=0){

        return getChildData($list, "ag_pid", "ag_id", "ag_name", $pid);
        /*$array = [];
        foreach ($list as $value) {
            if ($value['ag_pid'] == $pid) {
                $data['id'] = $value['ag_id'];
                $data['label'] = $value['ag_name'];
                $data['children'] = self::getChildAuthGroup($list, $value['ag_id']);
                $array[] = $data;
            }
        }
        return $array;*/
    }
    /*
     * 某角色是否是当前登录角色下级
     * @param array $role 角色组数据
     * @param int $roleId 查询的角色id
     * @return int
     */
    public static function isMyAuthGroup(array $roleList, int $roleId){
        foreach ($roleList as $key => $value){
            //如果是则返回真
            if($value['ag_id'] == $roleId) return true;
        }
        return false;
    }
    /*
     * 获取角色组状态
     * @param int $roleId 角色id
     */
    public static function getGroupStatus(int $roleId): int {

        return AuthGroup::where('ag_id',$roleId)->value('ag_status');
    }
    /*
     * 检查单个方法是否有权限
     * @param array $userData 管理员信息
     * @param string $method 控制器/方法url
     * @return bool
     */
    public static function checkMethod(array $userData, string $method): bool {
        //超级管理员拥有所有权限
        if($userData['ad_role'] == 0) return true;
        //获取方法信息
        //$methods = Db::name('auth_rule')->field('ar_id,ar_status')->where('ar_method',$method)->find();
        //是否找到auth_rule缓存
        $authRuleKey = Config::get("app.auth_rule");
        if(!Cache::has($authRuleKey)){
            //创建并获取权限信息
            $methodArray = AuthRule::setAuthRule();
        }else{
            $methodArray = Cache::get($authRuleKey);
        }
        //未找到权限缓存提示信息
        if(!$methodArray) alertDemo("未找到权限信息，请前往更新权限缓存");
		if(empty($methodArray[$method])) alertDemo("未找到权限信息，请前往更新权限缓存");
        //找出该方法信息
        $methods = $methodArray[$method];
        //如果该方法被禁用则无法访问
        if($methods['ar_status'] == 0) return false;
        //用户角色是否有此方法权限id
        $count = AuthGroup::where('ag_id',$userData['ad_role'])->where('FIND_IN_SET(:methodId, ag_rules)',['methodId'=>$methods['ar_id']])->count('ag_id');
        if($count > 0){
            return true;
        }else{
            return false;
        }
    }
    /*
     * 检查多个方法是否有权限
     * @param array $userData 管理员信息
     * @param array $method 控制器/方法url
     * @return array
     */
    public static function checkMethodArray(array $userData, array $methods): array {
        /** 方法数组示例
        $methods = [
            'Member/personalMemberDatchDel',
            'Member/personalMemberInfo'
        ];*/
        //创建一个空数组
        $data = [];
        //超级管理员拥有所有权限
        if($userData['ad_role'] == 0) {
            foreach ($methods as $key => $value){
                //去除斜杠
                $string = str_replace("/", false, $value);
                $data[$string] = 1;
            }
            return $data;
        }else{
            //获取权限信息
            $methodArray = Cache::get(Config::get("app.auth_rule"));
            //遍历是否有此权限
            foreach ($methods as $value){
                if(empty($methodArray[$value])) alertDemo("未找到权限信息，请前往更新权限缓存");
                $method = $methodArray[$value];
                //去除斜杠
                $string = str_replace("/", false, $value);
                //如果改方法被禁用
                if($method['ar_status'] == 0){
                    $data[$string] = 0;
                }else{
                    //用户角色是否有此方法权限id
                    $data[$string] = AuthGroup::where('ag_id',$userData['ad_role'])->where('FIND_IN_SET(:methodId, ag_rules)',['methodId'=>$method['ar_id']])->count('ag_id');
                }
            }
        }
        return $data;
        /** 查询数据库检查
        //获取方法id
        $method = implode(',', $methods);
        $map[] = ['ar_method', 'in', $method];
        //后台/前台方法
        $map[] = ['ar_beforeAfter','=',$beforeAfter];
        $methodInfo = Db::name('auth_rule')->field('ar_id,ar_method,ar_status')->where($map)->select();
        foreach ($methodInfo as $key => $value){
        //去除斜杠
        $string = str_replace("/", "", $value["ar_method"]);
        //如果改方法被禁用
        if($value['ar_status'] == 0){
        $data[$string] = 0;
        }else{
        //用户角色是否有此方法权限id
        $data[$string] = Db::name('auth_group')->where('ag_id',$userData['ad_role'])
        ->where('FIND_IN_SET(:methodId,ag_rules)',['methodId'=>$value['ar_id']])
        ->count('ag_id');
        }
        }*/
    }
    /*
     * 管理员是否有菜单显示权限
     * @param array $userData 管理员信息
     * @param array $info 菜单列表数组
     * @return array
     */
    public static function menuAuthCheck(array $userData, array $menu): array {
        //如果不是超级管理员
        if($userData['ad_role'] > 0){
            //查询登录管理员所有的权限id
            $rules = AuthGroup::where('ag_id',$userData['ad_role'])->value('ag_rules');
            $rulesArray = explode(',', $rules);
            //去除该登录管理员没有的权限菜单
            $menu = self::menuAuthChildCheck($rulesArray, $menu);
        }
        return $menu;
    }
    /*
     * 管理员是否有菜单显示权限递归检测
     * @param array $rulesArray 管理员拥有的权限
     * @param array $info 菜单列表数组
     * @return array
     */
    protected static function menuAuthChildCheck(array $rulesArray, array $menu){
        $array = [];
        //去除该登录管理员没有的权限菜单
        foreach ($menu as $key => $value){
            //如果管理员有这个权限
            if(in_array($value['rulesId'], $rulesArray)){
                $array[$key] = $value;
                //如果管理员有检查子菜单权限
                if(!empty($value["child"])){
                    $array[$key]["child"] = self::menuAuthChildCheck($rulesArray, $value["child"]);
                    if(empty($array[$key]["child"])) unset($array[$key]["child"]);
                }
            }
        }
        return $array;
    }
}